In database systems, hash joins are a commonly used operation in data warehouse query processing. An important challenge for hash joins is managing the sizes of the hash table used. Many systems employ partitioning to split hash tables into manageable sized chunks. One side of the hash join is chosen as inner and its hash table is partitioned. The inner table is also referred to in the literature as the “build” side. The rows of the other side (the outer table) of the join are also partitioned and then used to look up into the partitioned hash tables. The outer table is also referred to in the literature as the “probe” side. Traditionally, databases were disk-resident wherein the goal was to partition hash tables into memory-sized chunks. However, as main memories have grown much larger, the goal is to partition hash tables into cache-sized chunks.